#include "ventanaprincipal.h"
#include "imapa.h"

#define TAB_ROWS 32
#define TAB_COLS 32

using namespace ui::tablero::mapa;

namespace ui {

VentanaPrincipal::VentanaPrincipal(const Glib::RefPtr<const Gdk::GL::Config>& p_Config) :
	Window(WINDOW_TOPLEVEL),
	m_tabPrincipal(TAB_ROWS, TAB_COLS, false),
	m_drwTablero(p_Config) {

	this->set_title("TP Final");
	this->set_position(WIN_POS_CENTER);
	this->maximize();

	//Create actions for menus and toolbars:
	this->m_refActionGroup = Gtk::ActionGroup::create();

	this->m_refActionGroup->add(Gtk::Action::create("mnuJuego", "Juego"));
	this->m_refActionGroup->add(Gtk::Action::create("mnuJuegoSalir", "Salir"),
		Gtk::AccelKey("<control>S"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_JuegoSalir));

	this->m_refActionGroup->add(Gtk::Action::create("mnuPartido", "Partido"));
	this->m_refActionGroup->add(Gtk::Action::create("mnuPartidoNuevo", "Nuevo"),
		Gtk::AccelKey("<control>N"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_PartidoNuevo));
	this->m_refActionGroup->add(Gtk::Action::create("mnuPartidoConectar", "Conectar"),
		Gtk::AccelKey("<control>C"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_PartidoConectar));
	this->m_refActionGroup->add(Gtk::Action::create("mnuPartidoAbandonar", "Abandonar"),
		Gtk::AccelKey("<control>A"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_PartidoAbandonar));
	this->m_refActionGroup->add(Gtk::Action::create("mnuPartidoUbicar", "Ubicar"),
		Gtk::AccelKey("<control>U"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_PartidoUbicar));
	this->m_refActionGroup->add(Gtk::Action::create("mnuPartidoAtacar", "Atacar"),
		Gtk::AccelKey("<control>A"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_PartidoAtacar));
	this->m_refActionGroup->add(Gtk::Action::create("mnuPartidoReubicar", "Reubicar"),
		Gtk::AccelKey("<control>R"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_PartidoReubicar));

	this->m_refActionGroup->add(Gtk::Action::create("mnuMapa", "Mapa"));
	this->m_refActionGroup->add(Gtk::Action::create("mnuMapaEsferico", "Esferico"),
		Gtk::AccelKey("<control>E"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_MapaEsferico));
	this->m_refActionGroup->add(Gtk::Action::create("mnuMapaPlano", "Plano"),
		Gtk::AccelKey("<control>P"),
		sigc::mem_fun(*this, &VentanaPrincipal::on_menu_MapaPlano));

	this->m_refUIManager = Gtk::UIManager::create();
	this->m_refUIManager->insert_action_group(m_refActionGroup);

	Glib::ustring ui_info = 
		"<ui>"
		"  <menubar name='MenuBar'>"
		"    <menu action='mnuJuego'>"
		"      <menuitem action='mnuJuegoSalir'/>"
		"    </menu>"
		"    <menu action='mnuPartido'>"
		"      <menuitem action='mnuPartidoNuevo'/>"
		"      <menuitem action='mnuPartidoConectar'/>"
		"      <separator/>"
		"      <menuitem action='mnuPartidoAbandonar'/>"
		"      <separator/>"
		"      <menuitem action='mnuPartidoUbicar'/>"
		"      <menuitem action='mnuPartidoAtacar'/>"
		"      <menuitem action='mnuPartidoReubicar'/>"
		"    </menu>"
		"    <menu action='mnuMapa'>"
		"      <menuitem action='mnuMapaEsferico'/>"
		"      <menuitem action='mnuMapaPlano'/>"
		"    </menu>"
		"  </menubar>"
		"</ui>";

	this->add_accel_group(m_refUIManager->get_accel_group());
	this->m_refUIManager->add_ui_from_string(ui_info);
	Gtk::Widget* pMenubar = m_refUIManager->get_widget("/MenuBar");

	//OTRO
	this->m_frmOtro.set_label("RISK");
	this->m_frmOtro.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmOtro.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	//Estadisticas
	this->m_frmEstadisticas.set_label("Estadisticas");
	this->m_frmEstadisticas.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmEstadisticas.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	this->estadisticasSalida.set_editable(false);
	this->m_frmEstadisticas.add(estadisticasSalida);
	this->otroVBox.pack_start(m_frmEstadisticas, true, true, 10);
	//Mision
	this->m_frmMision.set_label("Mision");
	this->m_frmMision.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmMision.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	this->misionBoton.set_label("Ver Misión");
	this->misionBox.pack_start(misionBoton);
	this->m_frmMision.add(misionBox);
	this->otroVBox.pack_start(m_frmMision,false,true,10);
	//Boton Mapa
	this->m_frmBotonMapa.set_label("Mapa");
	this->m_frmOtro.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmOtro.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	this->mapaBoton.set_label("Cambiar Vista");
	mapaBoton.signal_clicked().connect( sigc::mem_fun(*this,
					            &VentanaPrincipal::on_mapa_boton_clicked));
	this->mapaBox.pack_start(mapaBoton);
	this->m_frmBotonMapa.add(mapaBox);
	this->otroVBox.pack_start(m_frmBotonMapa,false,true,10);
	//Estado
	this->m_frmEstado.set_label("Acciones");
	this->m_frmEstado.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmEstado.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	this->estadoBoton.set_label("No es tu turno");
	estadoBoton.signal_clicked().connect( sigc::mem_fun(*this,
						            &VentanaPrincipal::on_estado_boton_clicked));
	estadoJuego = ESTADO_NO_TURNO;
	this->estadoBox.pack_start(estadoBoton);
	this->m_frmEstado.add(estadoBox);
	this->otroVBox.pack_start(m_frmEstado, false, true, 10);
	
	this->m_frmOtro.add(otroVBox);
	
	//CHAT
	this->m_frmChat.set_label("Chat");
	this->m_frmChat.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmChat.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	this->hBoxChat.pack_start(this->chatEntrada, true, true,0);
	this->chatEntrada.set_editable(true);
	this->hBoxChat.pack_start(this->chatBotonEnviar, false, true, 0);
	chatBotonEnviar.signal_clicked().connect( sigc::mem_fun(*this,
				            &VentanaPrincipal::on_enviar_clicked));
	chatBotonEnviar.set_state(Gtk::STATE_PRELIGHT);
	this->chatBotonEnviar.set_label("Enviar");
	this->vBoxChat.pack_start(this->chatS1, false, false, 0);
	this->chatBarra.add(chatSalida);
	this->chatBarra.get_hscrollbar()->hide();
	this->vBoxChat.pack_start(this->chatBarra, true, true, 0);
	this->chatSalida.set_editable(false);
	this->vBoxChat.pack_start(this->chatS2, false, false, 0);
	this->vBoxChat.pack_start(this->hBoxChat, false, true, 0);
	this->m_frmChat.add(vBoxChat);
	
	//INFORMACION
	this->m_frmInfo.set_label("Info");
	this->m_frmInfo.set_label_align(Gtk::ALIGN_LEFT, Gtk::ALIGN_TOP);
	this->m_frmInfo.set_shadow_type(Gtk::SHADOW_ETCHED_OUT);
	this->infoSalida.set_editable(false);
	this->infoBarra.add(infoSalida);
	this->m_frmInfo.add(infoBarra);
	
	
	
	this->m_tabPrincipal.attach(*pMenubar, 0, 32, 0, 1,
		Gtk::FILL | Gtk::SHRINK, Gtk::FILL | Gtk::SHRINK, 0, 0);
	this->m_tabPrincipal.attach(this->m_drwTablero, 0, 24, 1, 23,
		Gtk::FILL | Gtk::SHRINK, Gtk::FILL | Gtk::SHRINK, 0, 0);
	this->m_tabPrincipal.attach(this->m_frmOtro, 24, 32, 1, 23,
		Gtk::FILL | Gtk::EXPAND, Gtk::FILL | Gtk::EXPAND, 0, 0);
	this->m_tabPrincipal.attach(this->m_frmChat, 0, 12, 23, 32,
		Gtk::FILL | Gtk::EXPAND, Gtk::FILL | Gtk::EXPAND, 0, 0);
	this->m_tabPrincipal.attach(this->m_frmInfo, 12, 32, 23, 32,
		Gtk::FILL | Gtk::EXPAND, Gtk::FILL | Gtk::EXPAND, 0, 0);
	this->add(this->m_tabPrincipal);

	this->show_all();
}

VentanaPrincipal::~VentanaPrincipal() {
}

bool VentanaPrincipal::on_key_press_event(GdkEventKey *event) {

	if(this->m_drwTablero.on_key_press_event(event) == false){
		this->chatEntrada.on_key_press(event);
	}
	return true;
}

void VentanaPrincipal :: on_enviar_clicked(){
	
	if(this->chatEntrada.get_text().compare("") != 0){
		string msg;
		msg.assign(chatEntrada.get_text());
		msg.append("\n");
		chatMsg.append(msg);
		Glib::RefPtr<Gtk::TextBuffer> chatBuffer = Gtk::TextBuffer::create();
		chatBuffer->set_text(chatMsg);
		chatSalida.set_buffer(chatBuffer);
		chatEntrada.set_text("");
		double upper = chatBarra.get_vadjustment()->get_upper();
		chatBarra.get_vadjustment()->set_value(upper);
		chatBarra.get_vadjustment()->changed();
	}
	return;
}

void VentanaPrincipal :: on_mapa_boton_clicked(){
	if(this->m_drwTablero.get_tipo_mapa() == MAPA_PLANO){
		this->m_drwTablero.cambiarMapa(MAPA_ESFERICO);
	}
	else this->m_drwTablero.cambiarMapa(MAPA_PLANO);
}

void VentanaPrincipal :: on_estado_boton_clicked(){
	
	switch(estadoJuego){
		case (ESTADO_NO_TURNO): estadoJuego = ESTADO_REFUERZO;
						  	estadoBoton.set_label("ATACAR");
						  	escribirInfo("Es tu turno");
						  	escribirInfo("Has comenzado el estado de Refuerzo");
							break;
	
		case (ESTADO_REFUERZO): estadoJuego = ESTADO_ATAQUE;
						  	estadoBoton.set_label("FORTIFICAR");
						  	escribirInfo("Haz finalizado el estado de Refuerzo");
						  	escribirInfo("Has comenzado el estado de Ataque");
							break;
		case (ESTADO_ATAQUE): 	estadoJuego = ESTADO_FORTIFICACION;
						  	estadoBoton.set_label("TERMINAR");
						  	escribirInfo("Has finalizado el estado de Ataque");
						  	escribirInfo("Has comenzado el estado de Fortificación");
						  	break;
		case (ESTADO_FORTIFICACION): estadoJuego = ESTADO_NO_TURNO;
							estadoBoton.set_label("No es tu turno");
							escribirInfo("Has terminado el estado de Fortificacion");
							escribirInfo("Termino tu turno");
							break;
	}
}

void VentanaPrincipal::on_menu_JuegoSalir() {
	this->hide();
	Gtk::Main::quit();
}

void VentanaPrincipal::on_menu_PartidoNuevo() {
}

void VentanaPrincipal::on_menu_PartidoConectar() {
}

void VentanaPrincipal::on_menu_PartidoAbandonar() {
}

void VentanaPrincipal::on_menu_PartidoUbicar() {
}

void VentanaPrincipal::on_menu_PartidoAtacar() {
}

void VentanaPrincipal::on_menu_PartidoReubicar() {
}

void VentanaPrincipal::on_menu_MapaEsferico() {
	this->m_drwTablero.cambiarMapa(MAPA_ESFERICO);
}

void VentanaPrincipal::on_menu_MapaPlano() {
	this->m_drwTablero.cambiarMapa(MAPA_PLANO);
}

void VentanaPrincipal :: escribirInfo(string msg){
	msg.append("\n");
	infoMsg.append(msg);
	Glib::RefPtr<Gtk::TextBuffer> chatBuffer = Gtk::TextBuffer::create();
	chatBuffer->set_text(infoMsg);
	infoSalida.set_buffer(chatBuffer);
	double upper = infoBarra.get_vadjustment()->get_upper();
	infoBarra.get_vadjustment()->set_value(upper);
	infoBarra.get_vadjustment()->changed();
}

}
